package vista.juego;

import control.juego.ControladorJuego;

import observadores.Observador;
import vista.HerramientasConsola;
import vista.capital.VistaCapitalActualConsola;
import vista.capital.VistaCapitalesDestinoConsola;
import vista.lugaresYPistas.VistaEstablecimientosConsola;
import modelo.delictivas.ITrampa;
import modelo.delictivas.Ladron;
import modelo.juego.Juego;
import modelo.lugaresYPistas.IRespuesta;

public class VistaJuegoConsola implements Observador{

	private Juego juego;

	private VistaCapitalActualConsola vistaCapital;
	private VistaEstablecimientosConsola vistaEstablecimientos;
	private VistaCapitalesDestinoConsola vistaCapitalesDestino;

	private ControladorJuego controlJuego;
	private VistaTiempoConsola vistaTiempo;
	private VistaCrimenConsola vistaCrimen;

	private boolean iniciarVistas;
	
	public VistaJuegoConsola(Juego juego, ControladorJuego controlJuego) {
		this.juego = juego;
		this.juego.agregarObservador(this);
		this.controlJuego = controlJuego;
		this.iniciarVistas = true;
	}

	@Override
	public void actualizar() {
		if(this.juego.getJugadorActual() == null)
			this.iniciarJuego();
	}

	private void iniciarJuego() {
		
		HerramientasConsola.imprimir("Bienvenido a Algothief");
		try {
			if(this.juego.getJugadorActual() == null)
				this.pedirIdentificacion();
			else 
				this.actualizarPantallaJugador();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void pedirIdentificacion() throws Exception {
		HerramientasConsola.imprimir("Identifiquese: ");
		String nombre = "";
		nombre = HerramientasConsola.leer();
		
		this.controlJuego.identificarJugador(nombre);
		
		if(this.juego.getJugadorActual() == null)
		{
			this.pedirResolucionJugadorNoExistente(nombre);
		}
		else 
		{
			HerramientasConsola.imprimir("Bienvenido, " 
					+ this.juego.getJugadorActual().getRango().getNombre() + " "
					+ this.juego.getJugadorActual().getNombre());
			this.actualizarPantallaJugador();
		}
	}

	private void pedirResolucionJugadorNoExistente(String nombre) {
		
		String opcion = HerramientasConsola.pedirRespuestaSoNAPregunta("El policia no se encuentra en la base de datos de Interpol" +
				", desea darse de alta? S/N");
		
		if(opcion.equals("S"))
			try {
				this.altaDeJugador(nombre);
				this.actualizarPantallaJugador();
			} catch (Exception e) {
				e.printStackTrace();
			}
		else
			try {
				this.pedirIdentificacion();
			} catch (Exception e) {
				e.printStackTrace();
			}
	}

	private void altaDeJugador(String nombre) throws Exception {
		this.controlJuego.crearJugador(nombre);
		HerramientasConsola.imprimir("Bienvenido a Interpol, " + this.juego.getJugadorActual().getRango().getNombre() + " "
				+ this.juego.getJugadorActual().getNombre());
	}

	private void actualizarPantallaJugador() {
		
		if(this.juego.enJuego()){
			if(this.iniciarVistas)
			{
				if(!this.controlJuego.partidaIniciada())
					this.iniciarPartida();
				else 
					this.continuarPartida();
				
				this.vistaCapital = new VistaCapitalActualConsola(this.juego.getJugadorActual());
				this.vistaCapitalesDestino = new VistaCapitalesDestinoConsola(this.juego.getJugadorActual());
				this.vistaEstablecimientos = new VistaEstablecimientosConsola(this.juego.getJugadorActual());
				this.vistaCrimen = new VistaCrimenConsola(this.juego);
				this.iniciarVistas = false;
			}
			
			this.vistaCapitalesDestino.actualizarCapitalesDestino(this.juego.getJugadorActual());
			this.vistaEstablecimientos.actualizarEstablecimientos(this.juego.getJugadorActual());
			
			HerramientasConsola.imprimir("\n" + this.vistaCapital.imprimirEnConsola() + "                " + this.vistaTiempo.imprimirTiempoRestante());
			
			this.mostrarMenuPrincipal();
			
			if(!this.juego.getJugadorActual().getInvestigacion().enProceso())
				this.preguntarNuevaPartida();
			
			this.actualizarPantallaJugador();
		}
		else
			HerramientasConsola.imprimir("Gracias por jugar Algothief!");
		
	}

	private void mostrarMenuPrincipal() {
		HerramientasConsola.imprimir("Ingrese opcion de accion a realizar:");
		HerramientasConsola.imprimir("1) Visitar establecimiento \n" +
				"2) Viajar\n" +
				"3) Gestionar datos del ladron\n" +
				"4) Guardar\n" +
				"5) Salir");
		
		String opcion = HerramientasConsola.pedirOpcionEntre(1, 5);
			if(opcion.equals("1"))
				this.vistaEstablecimientos.verEstablecimientos(this.juego.getJugadorActual());
			else if (opcion.equals("2"))
				this.vistaCapitalesDestino.verCapitalesDestino(this.juego.getJugadorActual());
			else if (opcion.equals("3"))
				this.vistaCrimen.mostrar();
			else if (opcion.equals("4"))
				try {
					this.controlJuego.guardarPartida();
				} catch (Exception e) {
					e.printStackTrace();
				}
			else if (opcion.equals("5"))
				try {
					this.controlJuego.finalizarPartida();
				} catch (Exception e) {
					e.printStackTrace();
				}
			
	}

	private void continuarPartida() {
		try {
			this.controlJuego.continuarPartida();
			this.vistaTiempo = new VistaTiempoConsola(this.juego.getJugadorActual());

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void iniciarPartida() {
		try {
			
			this.controlJuego.iniciarPartida();
			
			this.vistaTiempo = new VistaTiempoConsola(this.juego.getJugadorActual());

			String nombreTesoro = this.juego.getJugadorActual().getInvestigacion().getTesoroRobado().getNombre();
			String nombreCapitalInicial = this.juego.getJugadorActual().getInvestigacion().getTesoroRobado().getCapitalDeOrigen().getNombre();
			
			String dato = this.juego.obtenerDatoInicial();
			
			HerramientasConsola.imprimir("Un sospechoso de sexo "+ dato +" ha robado un "
			+ nombreTesoro + " en " + nombreCapitalInicial 
			+ ". Se te solicita que te dirijas al lugar del crimen y atrapes al delincuente. Tienes tiempo hasta: " + this.vistaTiempo.getDiaLimite());
		
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private void preguntarNuevaPartida() {
		String opcion = HerramientasConsola.pedirRespuestaSoNAPregunta("Deseas iniciar una nueva investigacion? S/N");
		
		if(opcion.equals("S"))
			this.iniciarPartida();
		else
			this.juego.finalizarJuego();
	}

	@Override
	public void ladronEncontrado() {
		HerramientasConsola.imprimir("Ladron encontrado!!!");
	}

	@Override
	public void trampaActivada(ITrampa trampa) {
		HerramientasConsola.imprimir(trampa.getAccion());
		HerramientasConsola.pedirCualquierTeclaParaContinuar();

	}

	@Override
	public void ladronArrestado() {
		String capitalDeTesoro = this.juego.getJugadorActual().
				getInvestigacion().getTesoroRobado().getCapitalDeOrigen().getNombre();
		
		String nombreTesoro = this.juego.getJugadorActual().
				getInvestigacion().getTesoroRobado().getNombre();
		
		HerramientasConsola.imprimir("Has arrestado al ladron!");
		HerramientasConsola.imprimir("Se ha devuelto el tesoro "+ nombreTesoro + " a la gente de " + capitalDeTesoro );
		
		try {
			this.controlJuego.verificarAscenso();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public void ladronEscapa() {
		HerramientasConsola.imprimir("Pero el ladron ha escapado, no tenias orden de arresto");
		HerramientasConsola.pedirCualquierTeclaParaContinuar();
	}

	@Override
	public void respuestaRecibida(IRespuesta respuesta) {
		HerramientasConsola.imprimir(respuesta.getTexto());
		HerramientasConsola.pedirCualquierTeclaParaContinuar();

	}

	@Override
	public void ordenArrestoDenegada() {
		HerramientasConsola.imprimir("No se ha encontrado un sospechoso que cumpla con los datos dados.");
		HerramientasConsola.pedirCualquierTeclaParaContinuar();

	}

	@Override
	public void ordenArrestoObtenida(Ladron ladron) {
		HerramientasConsola.imprimir("Sospechoso compatible encontrado! Se ha emitido una orden de arresto para " +
				ladron.getNombre());
		HerramientasConsola.pedirCualquierTeclaParaContinuar();

	}

	@Override
	public void policiaDuerme() {
		HerramientasConsola.imprimir("Durmiendo...");
		HerramientasConsola.pedirCualquierTeclaParaContinuar();

	}

	@Override
	public void jugadorViaja() {
		this.vistaCapitalesDestino.actualizarCapitalesDestino(this.juego.getJugadorActual());
		this.vistaEstablecimientos.actualizarEstablecimientos(this.juego.getJugadorActual());
		HerramientasConsola.imprimir("Viajando...");
		HerramientasConsola.pedirCualquierTeclaParaContinuar();

	}

	@Override
	public void ascensoDePolicia() {
		HerramientasConsola.imprimir("Asciendes de rango! Tu nuevo rango es: " + this.juego.getJugadorActual().getRango().getNombre());
	}

	@Override
	public void faltanAscensos(int arrestosFaltantes) {
		HerramientasConsola.imprimir("Arrestos para proximo ascenso: " + arrestosFaltantes);
	}

	@Override
	public void tiempoTerminado() {
		HerramientasConsola.imprimir("Se ha acabado el tiempo!");
		HerramientasConsola.pedirCualquierTeclaParaContinuar();
	}
	
	

}
